Os Dados

file_extension: A extensão do arquivo.
data %>% select(file_extension) %>% unique
## # A tibble: 42 x 1
##    file_extension
##    <chr>         
##  1 md            
##  2 js            
##  3 json          
##  4 html          
##  5 py            
##  6 java          
##  7 css           
##  8 xml           
##  9 txt           
## 10 yml           
## # ... with 32 more rows

Como é possível ver no resumo acima, temos extensões para scripts, imagens, textos, etc.

month_day, the_month, the_year: Dia, mês e ano respectivamente em que a coleta dos dados foi efetuada.
data %>% select(-file_extension, -users) %>% summary()
##    month_day       the_month         the_year   
##  Min.   : 1.00   Min.   : 1.000   Min.   :2016  
##  1st Qu.: 8.00   1st Qu.: 3.000   1st Qu.:2016  
##  Median :15.00   Median : 4.000   Median :2016  
##  Mean   :15.49   Mean   : 5.427   Mean   :2016  
##  3rd Qu.:23.00   3rd Qu.: 8.000   3rd Qu.:2017  
##  Max.   :31.00   Max.   :12.000   Max.   :2017

Temos dados desde 2016 até 2017, como falado anteriormente.

users: Quantidade de usuários que modificaram aquele tipo de arquivo até a data da coleta.
data %>% select(users) %>% summary()
##      users      
##  Min.   :  501  
##  1st Qu.:  763  
##  Median : 1520  
##  Mean   : 2151  
##  3rd Qu.: 2782  
##  Max.   :10279

Como possível visualizar acima, temos tipos de arquivos que tiveram 501 usuários mas também temos outros que tiveram 10279 usuários.

Conceitos

Popularity

Para popularidade não teremos tanto trabalho, iremos adotar a popularidade como sendo a mediana de usuários que contribuíram. Ou seja, quanto maior a média, mais popular é aquela linguagem.

Perguntas

Para as duas linguagens de programação mais “populares” do ultimo mês do registro, como que se comportou o crescimento delas durante cada mês?

Para isso, iremos pegar as linguagens de programação no nosso conjunto de dados e a partir disso selecionar apenas as que tiveram registros no último mês.

Após a aplicação de uma função max, obtivemos o valor:

languages %>% 
  filter(file_extension %in% some_programming_languages) %>%
  filter(the_year == 2017) %>%
  select(the_month) %>%
  sapply(max, na.rm = TRUE)
## the_month 
##         5

Portanto, sabemos que o último mês de 2017 que tivemos registros foi o mês 5.

Panorama geral de Popularidade

languages %>% 
  filter(file_extension %in% some_programming_languages) %>%
  group_by(file_extension) %>%
  summarise(popularity = median(users)) %>%
    ggplot(aes(
      x = reorder(file_extension, popularity),
      y = popularity,
      fill = file_extension)) + 
    geom_bar(stat = "identity") + 
    labs(x = "Linguagem de Programação", y = "Popularidade") +
    guides(fill=guide_legend(title=NULL)) -> p

ggplotly(p)

Visualização apenas para o último mês.

languages %>% 
  filter(file_extension %in% some_programming_languages) %>%
  filter(the_year == 2017, the_month == 5) %>%
  group_by(file_extension) %>%
  summarise(popularity = median(users)) %>%
    ggplot(aes(
      x = reorder(file_extension, popularity),
      y = popularity,
      fill = file_extension)) + 
    geom_bar(stat = "identity") + 
    labs(x = "Linguagem de Programação", y = "Popularidade") +
    guides(fill=guide_legend(title=NULL)) -> p

ggplotly(p)

Como podemos ver acima, as duas linguagens de programação mais populares foram js e py, JavaScript e Python respectivamente.

selected_languages <- languages %>% filter(file_extension %in% c("py","js"))

A partir disso, iremos fazer uma comparação mês a mês entre as linguagens Python e JavaScript e verificar como se comporta a diferença de crescimento de usuários.

set.seed(123)

ic_diff = function(data, group1, group2, period){
    difference = function(data, i, group1, group2){
        d = data %>% 
            slice(i) %>% 
            group_by(file_extension, the_month, the_year) %>% 
            summarise(popularity = median(users)) %>%
            mutate(mmyy = paste(the_month, the_year, sep = "-")) %>%
            filter(mmyy == period)
        
        group1_df <- d %>% filter(file_extension == group1)
        group2_df <- d %>% filter(file_extension == group2)

        m1 = 0
        m2 = 0
        
        if (nrow(group1_df) != 0) {
          m1 = group1_df %>% pull(popularity)
        }
        
        if (nrow(group2_df) != 0) {
          m2 = group2_df %>% pull(popularity)
        }
        
        m1 - m2
    }
    
    bootstrap = boot(data, 
                     statistic = difference, 
                     R = 1000,
                     group1 = group1, 
                     group2 = group2)
    
    ci = boot.ci(bootstrap, 
                 conf = 0.95, 
                 type = "basic")
    ci
}

languages_2016 <- selected_languages %>% filter(the_year == 2016)
languages_2017 <- selected_languages %>% filter(the_year == 2017)
months <- c("JAN", "FEV", "MAR", "ABR", "MAI", "JUN", "JUL", "AGO", "SET", "OUT", "NOV", "DEZ")
set.seed(123)

order_comp <- factor(comparacoes$comparacao, levels = months)

comparacoes %>% 
    ggplot() + 
    aes(x = order_comp, ymin = lower, ymax = upper) + 
    geom_hline(yintercept = 0, colour = "red") + 
    geom_errorbar(width = .5) + 
    labs(x = "Mês", 
         y = "Diferença de Popularidade (py - js)") +
    facet_wrap(~year, scales = "free") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

Em todos os meses, exceto em MAIO de 2017, com um grau de confiança de 95%, a linguagem JavaScript é superior em popularidade em relação a Python, visto que a diferença (py - js) é negativa, ou seja, js > py.

E para as duas menos populares?

De forma análoga, as duas linguagens de programação menos populares para o último mês foram ts e go, TypeScript e GO respectivamente.

selected_languages_v2 <- languages %>% filter(file_extension %in% c("ts","go"))

Para responder nossa pergunta, iremos executar os mesmos passos da pergunta anterior.

set.seed(123)

languages_2016_v2 <- selected_languages_v2 %>% filter(the_year == 2016)
languages_2017_v2 <- selected_languages_v2 %>% filter(the_year == 2017)
set.seed(123)

order_comp_v2 <- factor(comparacoes_v2$comparacao, levels = months)

comparacoes_v2 %>% 
    ggplot() + 
    aes(x = order_comp_v2, ymin = lower, ymax = upper) + 
    geom_hline(yintercept = 0, colour = "red") + 
    geom_errorbar(width = .5) + 
    labs(x = "Mês", 
         y = "Diferença de Popularidade (go - ts)") +
    facet_wrap(~year, scales = "free") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

Em todos os meses, exceto em ABRIL de 2017, com um grau de confiança de 95%, a linguagem GO é superior em popularidade em relação a TypeScript, visto que a diferença (go - ts) é positiva, ou seja, go > ts.

Os desenvolvedores preferem commitar mais nas segundas e sextas ou nas terças, quartas e quintas?

Preparando os dados

Vamos coletar dados apenas das linguagens de programação vistas mais acima que tiveram suas coletas em dias da semana (entre segunda e sexta).

seg_sex <- c("segunda-feira", "sexta-feira")
sab_dom <- c("sábado", "domingo")
languages %>%
  mutate(is_seg_sex = weekdays(languages$cronology) %in% seg_sex) %>% 
  filter(weekdays(languages$cronology) %in% sab_dom != TRUE) %>%
  filter(file_extension %in% some_programming_languages) -> languages_days

languages_days %>%
  sample_n(10)
## # A tibble: 10 x 7
##    file_extension month_day the_month the_year users cronology  is_seg_sex
##    <chr>              <int>     <int>    <int> <int> <date>     <lgl>     
##  1 java                  17        11     2016  3742 2016-11-17 FALSE     
##  2 go                     6        12     2016  1011 2016-12-06 FALSE     
##  3 php                   21         2     2017  2653 2017-02-21 FALSE     
##  4 ts                    30        11     2016   856 2016-11-30 FALSE     
##  5 ts                     2         1     2017   631 2017-01-02 TRUE      
##  6 js                    17         1     2017  7451 2017-01-17 FALSE     
##  7 rb                    14         1     2016  1687 2016-01-14 FALSE     
##  8 go                     3        10     2016   836 2016-10-03 TRUE      
##  9 c                     15         2     2016  1618 2016-02-15 TRUE      
## 10 php                    8         3     2017  2383 2017-03-08 FALSE

Qual a popularidade de cada linguagem durante esses dois “períodos” da semana?

languages_days %>%
  group_by(file_extension, is_seg_sex) %>%
  summarise(popularity = median(users)) %>%
  ggplot(aes(
    x = reorder(file_extension, popularity),
    y = popularity,
    fill = is_seg_sex)) + 
  geom_histogram(stat = "identity") + 
  labs(x = "Linguagem de Programação", y = "Popularidade") -> p
## Warning: Ignoring unknown parameters: binwidth, bins, pad
ggplotly(p)

Com essa simples visualização conseguimos perceber que os commits costumam ser efetuados entre a Terças, Quartas e Quintas.

Bootstrapping

Como CC não possui nenhum registro dentro sendo uma Segunda ou Sexta, iremos removê-lo do Bootstrapping por não fazer sentido calcular diferença.

Definindo a função

Abaixo definimos a função que irá realizar o bootstrapping para cada uma das linguagens e extrair a diferença entre os dois períodos a serem avaliados na semana.

diffs <- frame_data(~lang, ~X2.5., ~X97.5.)

bootstrapping = function(data) {
  diff_median <- bootstrap2(data$users, 
                  treatment = data$is_seg_sex, 
                  median, R = 10000)
  
  diff = CI.percentile(diff_median, probs = c(.025, .975))
  
  diff
}

Diffs será o nosso conjunto de dados que irá armazenar a linguagem e o intervalo da diferença gerado pela função de bootstrapping.

Não irei mostrar o código usado para popular o conjunto de dados mas basicamente usei a função acima e atribuí os intervalos do diff para as colunas X2.5. e X97.5. respectivamente, além de colocar o nome da linguagem na coluna referente.

diffs %>%
  ggplot(aes(
    x = lang,
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "cyan") +
  labs(x = "Linguagem de Programação", y = "Diferença do is_seg_sex (FALSE - TRUE)")

Com a visualização acima, podemos perceber que por ter um valor majoritariamente positivo, exceto para as linguagens Swift (swift) e TypeScript (ts) que passam pelo eixo y = 0, os valores de usuários que commitam nas Terças, Quartas e Quintas é maior em relação aos que commitam nas Segundas e Sextas.

E entre Segunda e Sexta, qual o dia mais escolhido?

Para isso, iremos pegar apenas uma parte dos dados que faz referência aos commits em Segundas e Sextas.

seg_sex <- c("segunda-feira", "sexta-feira")
languages %>%
  mutate(is_seg = weekdays(languages$cronology) == "segunda-feira") %>% 
  filter(weekdays(languages$cronology) %in% seg_sex == TRUE) %>%
  filter(file_extension %in% some_programming_languages) -> languages_days_v2

languages_days_v2 %>%
  sample_n(10)
## # A tibble: 10 x 7
##    file_extension month_day the_month the_year users cronology  is_seg
##    <chr>              <int>     <int>    <int> <int> <date>     <lgl> 
##  1 php                   31         3     2017  2209 2017-03-31 FALSE 
##  2 rb                    24         6     2016  1260 2016-06-24 FALSE 
##  3 py                    13         1     2017  4604 2017-01-13 FALSE 
##  4 c                     28        10     2016  1421 2016-10-28 FALSE 
##  5 ts                     8         7     2016   570 2016-07-08 FALSE 
##  6 js                    29         8     2016  6632 2016-08-29 TRUE  
##  7 php                   22         2     2016  2998 2016-02-22 TRUE  
##  8 c                      7        10     2016  1243 2016-10-07 FALSE 
##  9 php                   27         1     2017  2375 2017-01-27 FALSE 
## 10 py                    25         1     2016  5036 2016-01-25 TRUE
languages_days_v2 %>%
  group_by(file_extension, is_seg) %>%
  summarise(popularity = median(users)) %>%
  ggplot(aes(
    x = reorder(file_extension, popularity),
    y = popularity,
    fill = !is_seg)) + 
  geom_histogram(stat = "identity") + 
  labs(x = "Linguagem de Programação", y = "Popularidade") -> p
## Warning: Ignoring unknown parameters: binwidth, bins, pad
ggplotly(p)

Com a visualização acima é possível perceber que o dia mais escolhido é a Sexta feira, pois existe uma maior quantidade de usuários (na maioria das linguagens) para a barra alaranjada.

Bootstrapping

De forma análoga à questão mais acima, usamos uma outra função para o bootstrapping, desta vez trocando apenas a variável que indica se o dia é Segunda ou não.

Aqui também retiramos a linguagem cc visto que ela não tem nenhum registro com data de Segunda ou Sexta.

diffs_v2 %>%
  ggplot(aes(
    x = lang,
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "cyan") +
  labs(x = "Linguagem de Programação", y = "Diferença do is_seg (FALSE - TRUE)")

Com a visualização acima, não conseguimos chegar a muitos resultados pois aproximadamente 77% (7 de 9) das linguagens passam o eixo y = 0. Podemos concluir apenas para as linguagens JavaScript (js) e PHP (php) que o dia mais escolhido para os commits é a Segunda, visto que a diferença é negativa, pois se FALSE - TRUE < 0, implica dizer que TRUE > FALSE.

Portanto, a Segunda é o dia mais escolhido apenas para JavaScript (js) e PHP (php). Enquanto que para as demais linguagens, nada podemos concluir.